use core::arch::naked_asm;

// 测试参数传递
#[inline(never)]
#[unsafe(no_mangle)]
fn printf_4_1(
    a: usize,
    b: usize,
    c: usize,
    d: usize,
    e: usize,
    f: usize,
    g: usize,
    h: usize,
    i: usize,
    j: usize,
) {
    println!("{a}, {b}, {c}, {d}, {e}, {f}, {g}, {h}, {i}, {j}");
}

/// 一共有10个参数
#[naked]
#[unsafe(no_mangle)]
pub extern "C" fn example_4_1() {
    unsafe {
        naked_asm!(
            r#"
                /* ra压栈 */
                addi sp, sp, -48
                sd ra, 40(sp)

                /* 保存参数 */
                li a0, 1
                li a1, 2
                li a2, 3
                li a3, 4
                li a4, 5
                li a5, 6
                li a6, 7
                li t0, 8
                sd t0, 0(sp)
                li t0, 9
                sd t0, 8(sp)
                li t0, 10
                sd t0, 16(sp)   /* 栈顶指向了最后一个参数 */
                /* 调用函数 */
                call printf_4_1
                ld ra, 40(sp)
                addi sp, sp, 48
                ret
            "#
        );
    }
}
